package com.plian.system.service.sys.orgzation;

import com.plian.Tools.UuidUtil;
import com.plian.Tools.pagedata.PageData;
import com.plian.system.bean.wf.User;
import com.plian.system.config.exception.MyRuntimeException;
import com.plian.system.dao.sys.orgzation.UserGroupRelationDao;
import com.plian.system.dao.sys.user.UserDao;
import com.plian.system.helper.wf.SessionHelper;
import com.plian.system.model.ObjResult;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 工作流用户组与用户关联服务类
 */
@Service
@Slf4j
public class UserGroupRelationService {
    @Autowired
    private UserGroupRelationDao userGroupRelationDao;

    @Autowired
    private UserDao userDao;

    /**
     * 增加用户组与用户的关联信息
     *
     * @param pd 请求数据
     */
    public void add(PageData pd) {
        try {
            User user = SessionHelper.getUser();
            pd.put("id", UuidUtil.get32UUID());
            pd.put("creatorId", user.getId());
            pd.put("creatorNickname", user.getNickname());
            pd.put("createTime", new Date());
            userGroupRelationDao.insert(pd);
        } catch (Exception e) {
            log.error(ExceptionUtils.getFullStackTrace(e));
            throw new MyRuntimeException(new ObjResult("往数据库插入工作流用户组与用户关联信息时失败！"));
        }
    }

    /**
     * 根据用户组id批量删除用户组与用户的关联信息
     *
     * @param pd 请求数据
     */
    public void deleteByGroupId(PageData pd) {
        try {
            userGroupRelationDao.deleteByGroupId(pd);
        } catch (Exception e) {
            log.error(ExceptionUtils.getFullStackTrace(e));
            throw new MyRuntimeException(new ObjResult("从数据库根据用户组id删除工作流用户组与用户关联信息时失败！"));
        }
    }

    /**
     * 批量插入用户组与用户的关联信息
     *
     * @param pageDataList 整理好的pageData列表
     */
    public void addBatch(List<PageData> pageDataList) {
        try {
            PageData pageData = new PageData();
            pageData.put("pageDataList",pageDataList);
            userGroupRelationDao.insertBatch(pageData);
        } catch (Exception e) {
            log.error(ExceptionUtils.getFullStackTrace(e));
            throw new MyRuntimeException(new ObjResult("往数据库批量插入工作流用户组与用户关联信息时失败！"));
        }
    }

    /**
     * 根据用户组id获取用户
     * @param pd 请求数据
     * @return ListResult
     */
    public List<PageData> selectUserListByGroupId(PageData pd) {
        try {
            List<String> userIdList = userGroupRelationDao.selectUserIdListByGroupId(pd);
            return userIdList.stream().map(userId -> {
                try {
                    return userDao.findbyid(userId);
                } catch (Exception e) {
                    log.error(ExceptionUtils.getFullStackTrace(e));
                    throw new MyRuntimeException(new ObjResult("根据用户id获取用户时失败！"));
                }
            }).collect(Collectors.toList());
        } catch (Exception e) {
            log.error(ExceptionUtils.getFullStackTrace(e));
            throw new MyRuntimeException(new ObjResult("根据用户组id获取用户时失败！"));
        }
    }

    /**
     * 根据单位id获取用户组列表
     * @param pd 请求数据
     */
    public List<PageData> selectByOrganizationId(PageData pd) {
        try {
            return userGroupRelationDao.selectByOrganizationId(pd);
        } catch (Exception e) {
            log.error(ExceptionUtils.getFullStackTrace(e));
            throw new MyRuntimeException(new ObjResult("根据单位id获取用户组列表时失败！"));
        }
    }
}
